/**
 * 
 */
package mm.back.service.impl;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

import mm.back.dao.DevolucionDAO;
import mm.back.dao.ProductoDAO;
import mm.back.entity.Baja;
import mm.back.entity.Devolucion;
import mm.back.entity.Producto;
import mm.back.filtros.ProductosFiltro;
import mm.back.service.MMAbstractService;
import mm.back.service.ProductoService;
import mm.exceptions.MMGenericException;

/**
 * @author PUSDERKIS
 *
 */
public class ProductoServiceImpl extends MMAbstractService implements
		ProductoService {

	private ProductoDAO productoDAO;
	private DevolucionDAO devolucionDAO;
	
	
	/** 
	 * @see mm.back.service.ProductoService#saveProducto(mm.back.entity.Producto)
	 */
	public void saveProducto(Producto producto) throws MMGenericException {
		if (logger.isDebugEnabled()){
			logger.debug("Se esta guardando un producto.");
		}
		
		productoDAO.saveProducto(producto);
		
		if (logger.isDebugEnabled()){
			logger.debug("El producto fue guardado con exito.");
		}
	}
	
	/** 
	 * @see mm.back.service.ProductoService#getProductos(java.lang.Boolean)
	 */
	public List<Producto> getProductos(Boolean activo)
			throws MMGenericException {
		return productoDAO.getProductos(activo);
	}
	

	/**
	 * @param productoDAO the productoDAO to set
	 */
	public void setProductoDAO(ProductoDAO productoDAO) {
		this.productoDAO = productoDAO;
	}

	/** 
	 * @see mm.back.service.ProductoService#getProductos(mm.back.filtros.ProductosFiltro)
	 */
	public List<Producto> getProductos(ProductosFiltro filtro)
			throws MMGenericException {
		 
		return productoDAO.getProductos(filtro);
	}

	/** 
	 * @see mm.back.service.ProductoService#getProducto(java.lang.Long)
	 */
	public Producto getProducto(Long id) throws MMGenericException {
		return getProdById(id);
	}

	/** 
	 * @see mm.back.service.ProductoService#deleteProducto(java.lang.Long)
	 */
	public void deleteProducto(Long id) throws MMGenericException {
		
		if (logger.isDebugEnabled()){
			logger.debug("Se intenta desactivar el producto con id: "+id);
		}
		Producto prod = getProducto(id);
		prod.setActivo(Boolean.FALSE);
		productoDAO.saveProducto(prod);
		if (logger.isDebugEnabled()){
			logger.debug("Se desactivo el producto "+id+" con exito.");
		}
		
	}

	/**
	 * @see mm.back.service.ProductoService#registrarBajaStock(java.lang.Long, java.math.BigDecimal, java.lang.String)
	 */
	public void registrarBajaStock(Long idProducto, BigDecimal cantidad,
			String motivo) throws MMGenericException {
		
		Producto producto = getProdById(idProducto);
		
		if (producto.getStock() != null && producto.getStock().compareTo(cantidad) < 0){
			throw new MMGenericException("Se intento dar de baja una cantidad superior a la que hay en stock del producto Número "+idProducto);
		}
		
		Baja baja = new Baja();
		baja.setCantidad(cantidad);
		baja.setMotivo(motivo);
		
		producto.getBajas().add(baja);
		
		BigDecimal nuevoStock = producto.getStock().subtract(cantidad);
		producto.setStock(nuevoStock);
		
		productoDAO.saveProducto(producto);
	}


	private Producto getProdById(Long id){
		ProductosFiltro pf = new ProductosFiltro();
		pf.setCodigo(id);
		
		List<Producto> prodList = productoDAO.getProductos(pf);
		if (prodList.size() == 1){
			return prodList.get(0);
		} else {
			return null;
		}
	}

	public void registrarDevolucion(Long idProducto, BigDecimal cantidad)
			throws MMGenericException {
		
		Producto prod = productoDAO.getProducto(idProducto);
		prod.setStock(prod.getStock().add(cantidad));
		
		Devolucion dev = new Devolucion();
		
		
		
		dev.setProducto(prod);
		dev.setCantidad(cantidad);
		dev.setPrecioVenta(prod.getPrecioVenta());
		
		Date fecha = new Date();
		dev.setFechaDev(fecha);
		
		devolucionDAO.registrarDevolucion(dev);
		
		
		
		productoDAO.saveProducto(prod);
		
		//producto.cantidad >= cantidad
		
		// TODO Auto-generated method stub
		
	}

	/**
	 * @param devolucionDAO the devolucionDAO to set
	 */
	public void setDevolucionDAO(DevolucionDAO devolucionDAO) {
		this.devolucionDAO = devolucionDAO;
	}

	/**
	 * @see mm.back.service.ProductoService#createProducto(mm.back.entity.Producto)
	 */
	public void createProducto(Producto producto) throws MMGenericException {
		
		if (logger.isDebugEnabled()){
			logger.debug("Se procede a crear un nuevo producto: " + producto); 
		}
		
		ProductosFiltro productoFiltro = new ProductosFiltro();
		
		productoFiltro.setNombre(producto.getNombre());
		productoFiltro.setRubroId(producto.getRubro().getId());
		
		
		
		List<Producto> productos = productoDAO.getProductos(productoFiltro);
		
		for ( Producto p : productos){
			if (producto.getNombre().equalsIgnoreCase(p.getNombre())){
				if (!p.getActivo()){
					p.setPrecioCompra(producto.getPrecioCompra());
					p.setPrecioVenta(producto.getPrecioVenta());
					p.setStock(producto.getStock());
					p.setStockMin(producto.getStockMin());
					p.setStockMax(producto.getStockMax());
					p.setActivo(true);
					productoDAO.saveProducto(p);
					
					if (logger.isDebugEnabled()){
						logger.debug("El producto fue dado de alta nuevamente con exito.");
					}
				} else {
					throw new MMGenericException("Ya hay un producto con el mismo nombre asociado al rubro.");
				}
				
			}
		}
		
		productoDAO.saveProducto(producto);
		
	}


}
